// 标准对象
// 在JavaScript的世界里，一切都是对象。

// 但是某些对象还是和其他对象不太一样。为了区分对象的类型，我们用typeof操作符获取对象的类型，它总是返回一个字符串：

var a = typeof 777
var b = typeof 'abc'
var c = typeof Math.abs
var d = typeof []
var f = typeof []
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(f);
// 可见，number、string、boolean、function和undefined有别于其他类型。
// 特别注意null的类型是object，Array的类型也是object，如果我们用typeof将无法区分出null、Array和通常意义上的object——{}。


//包装对象
// number、boolean和string都有包装对象。没错，在JavaScript中，字符串也区分string类型和它的包装类型。包装对象用new创建

var a1 = typeof new Number(123)
var a2 = typeof new String('str')
var a3 = typeof new Boolean(false)
console.log(a1);
console.log(a2);
console.log(a3);

// 虽然包装对象看上去和原来的值一模一样，显示出来也是一模一样，但他们的类型已经变为object了！所以，包装对象和原始值用===比较会返回false：

typeof new Number(123); // 'object'
new Number(123) === 123; // false


// 如果我们在使用Number、Boolean和String时，没有写new会发生什么情况？

// 此时，Number()、Boolean和String()被当做普通函数，把任何类型的数据转换为number、boolean和string类型（注意不是其包装类型）：

var n = Number('123'); // 123，相当于parseInt()或parseFloat()
typeof n; // 'number'

var b = Boolean('true'); // true
typeof b; // 'boolean'

var b2 = Boolean('false'); // true! 'false'字符串转换结果为true！因为它是非空字符串！
var b3 = Boolean(''); // false

var s = String(123.45); // '123.45'
typeof s; // 'string'



// 总结一下，有这么几条规则需要遵守：

// 不要使用new Number()、new Boolean()、new String()创建包装对象；

// 用parseInt()或parseFloat()来转换任意类型到number；

// 用String()来转换任意类型到string，或者直接调用某个对象的toString()方法；

// 通常不必把任意类型转换为boolean再判断，因为可以直接写if (myVar) {...}；

// typeof操作符可以判断出number、boolean、string、function和undefined；

// 判断Array要使用Array.isArray(arr)；

// 判断null请使用myVar === null；

// 判断某个全局变量是否存在用typeof window.myVar === 'undefined'；

// 函数内部判断某个变量是否存在用typeof myVar === 'undefined'。


// number对象调用toString()报SyntaxError：
// 222.toString();

// 遇到这种情况，要特殊处理一下：
222..toString();
(222).toString();


//不要问为什么要这样因为我也不知道




// Date
// 在JavaScript中，Date对象用来表示日期和时间。

// 要获取系统当前时间，用：

var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份，注意月份范围是0~11，5表示六月
now.getDate(); // 24, 表示24号
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小时制
now.getMinutes(); // 49, 分钟
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1435146562875, 以number形式表示的时间戳



var lj = new Date(2021, 11, 19)
console.log(lj);
// JavaScript的月份范围用整数表示是0~11，0表示一月，1表示二月……，所以要表示6月，我们传入的是5！

var p = Date.parse('2015-06-24T19:49:22.875+08:00')
console.log(p);

var m = new Date(1545425111441)
console.log(m);

console.log(m.getFullYear());


//获得当前时间戳

if (Date.now) {
    console.log(Date.now());
} else { console.log(new date().getTime()); }


// 练习 小明为了和女友庆祝情人节，特意制作了网页，并提前预定了法式餐厅。小明打算用JavaScript给女友一个惊喜留言：

'use strict';
var today = new Date();
if (today.getMonth() === 10 && today.getDate() === 19) {
    alert('亲爱的，我预定了晚餐，晚上6点在餐厅见！');
}




// RegExp
// 正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则，凡是符合规则的字符串，我们就认为它“匹配”了，否则，该字符串就是不合法的。
// // 在正则表达式中，如果直接给出字符，就是精确匹配。用\d可以匹配一个数字，\w可以匹配一个字母或数字，所以：

// '00\d'可以匹配'007'，但无法匹配'00A'；

// '\d\d\d'可以匹配'010'；

// '\w\w'可以匹配'js'；
// .可以匹配任意字符，所以：

// 'js.'可以匹配'jsp'、'jss'、'js!'等等。

// RegExp
// 有了准备知识，我们就可以在JavaScript中使用正则表达式了。

// JavaScript有两种方式创建一个正则表达式：

// 第一种方式是直接通过/正则表达式/写出来，第二种方式是通过new RegExp('正则表达式')创建一个RegExp对象。

// 两种写法是一样的：


var qw = /ABC\-101/
var vv = new RegExp('ABC\\-001');
console.log(qw);
console.log(vv);

var ll = /^\d{3}\-\d{3,8}$/
var k = ll.test('1484854')
console.log(k);
var k = ll.test('010- 248554')
console.log(k);